// Copyright 2011-2012, Vanya Davidenko.
// Используемая кодировка: UTF-8.

#ifndef LIBV_FILE_LINUX_SFILE_IMPL_HPP_
#define LIBV_FILE_LINUX_SFILE_IMPL_HPP_

#ifndef __linux__
# error "This header should be used in Linux only."
#endif

#include <limits.h>
#include <unistd.h>
#include <string>
#include <libv/stdint.h>
#include <libv/sfile.h>
#include <libv/file/basic_file.h>



namespace libv
{

// Методы Write и Read сильно копируют друг друга, однако, объединить их код
// для избежания дублирования не удалось.
bool SFile::WriteImpl(const fpos64& offset,
                      const void* data,
                      const uint32_t data_size)
{
    const ssize_t expected_return = static_cast<ssize_t>(data_size);
    const bool result = (
        ::pwrite(file_handle_,
                 data,
                 static_cast<size_t>(data_size),
                 offset) == expected_return );
    last_error_ = errno;

    return result;
}



bool SFile::ReadImpl(const fpos64& offset,
                     void* buffer,
                     const uint32_t buffer_size) const
{
    // result будет false, если достигнут EOF, но для SFile это ошибка.
    const ssize_t expected_return = static_cast<ssize_t>(buffer_size);
    const bool result = (
        ::pread(file_handle_,
                buffer,
                static_cast<size_t>(buffer_size),
                offset) == expected_return );
    last_error_ = errno;

    return result;
}

}  // libv

#endif  // LIBV_FILE_LINUX_SFILE_IMPL_HPP_
